package cn.com.zzz.taskpk.bussness;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import cn.bbs.ba.Timer.MiaoAction;
import cn.bbs.ba.base.BaseDto;
import cn.bbs.ba.error.BAErrorMessage;
import cn.bbs.ba.factory.BABeanFactory;
import cn.bbs.ba.format.ZZZFormat;
import cn.bbs.ba.html.ZPaiConstant;
import cn.bbs.ba.html.ZPaiInit;
import cn.bbs.ba.util.CommonUntil;
import cn.com.zzz.dao.PPJFDao;
import cn.com.zzz.dao.PkJFFlowDao;
import cn.com.zzz.pk.dto.PkJF;
import cn.com.zzz.pk.dto.PkJFFlow;
import cn.com.zzz.pk.dto.PkPepole;
import cn.com.zzz.pk.dto.PkTable;
import cn.com.zzz.util.Constant;
import cn.com.zzz.util.DataFormatUtil;

public class RoomBussness {

	/**
	 * 申请进入房间
	 * @param paraMap
	 * @return
	 */
	public static synchronized String inRomm(BaseDto paraMap) {
		BaseDto retDto = new BaseDto();
		retDto.setHostRetCode(Constant.MSG_0000);
		retDto.setHostMessage(Constant.MSG_SUCCESS);
		// 检查是否在游戏中
		if(checkIsRunnig(paraMap.getString("userNo"))) {
			retDto.setHostRetCode(Constant.MSG_10004);
			retDto.setHostMessage(BAErrorMessage.push(Constant.MSG_10004));
			// 正在别的桌子游戏
			retDto.setValue("stt", "2");
			return DataFormatUtil.formatRetData(retDto);
		}
		// 检查桌子是否已经有人了
		PkTable zhuoziDto = ZPaiInit.getTable().get(paraMap.getString("tableId"));
		if(zhuoziDto != null) {
			List<PkPepole> peopleList = (List<PkPepole> )zhuoziDto.getValue("people");
			
			for(int i = 0; i < peopleList.size(); i ++) {
				PkPepole pepole = peopleList.get(i);
				// 如果已经有人申请，则提示已经有人申请了。
				if (pepole.getAtWhere().equals(paraMap.getString("dengziId"))
						&& !pepole.getUserNo().equals(paraMap.getString("userNo"))) {
					retDto.setHostRetCode(Constant.MSG_10003);
					retDto.setHostMessage(BAErrorMessage.push(Constant.MSG_10003));
					// 此位置已经有人占领
					retDto.setValue("stt", "1");
					return DataFormatUtil.formatRetData(retDto);
				}
			}
			
			PkPepole people = new PkPepole();
			people.setUserNo(paraMap.getString("userNo"));
			people.setAlias(paraMap.getString("alias"));
			people.setAtWhere(paraMap.getString("dengziId"));
			people.setInMoney(paraMap.getString("drqs"));
			people.setOutMoney("0");
			people.setStt("0"); // 等待打牌中
			peopleList.add(people);
			
			// 正常
			retDto.setValue("stt", "0");
		}
		else {
			// 新建桌子 加入内存中
			List<PkPepole> peopleList = new ArrayList<PkPepole>();
			PkPepole people = new PkPepole();
			people.setUserNo(paraMap.getString("userNo"));
			people.setAlias(paraMap.getString("alias"));
			people.setAtWhere(paraMap.getString("dengziId"));
			people.setInMoney(paraMap.getString("drqs"));
			people.setOutMoney("0");
			people.setStt("0"); // 等待打牌中
			peopleList.add(people);
			
			//***************************//
			PPJFDao jfDao = (PPJFDao)BABeanFactory.getBean("JF");
			PkJF jf = new PkJF();
			jf.setUserNo(people.getUserNo());
			jf = jfDao.getJF(jf, "0").get(0);
			// 当前积分 - 赢取积分
			jf.setDqfs(CommonUntil.subtract(jf.getDqfs(), paraMap.getString("drqs")));
			// 更新当前积分
			jfDao.updateJF(jf);
			//***************************//
			PkTable zhuoziDto1 = new PkTable();
			zhuoziDto1.setTableId(paraMap.getString("tableId"));
			zhuoziDto1.setValue("people", peopleList);
			zhuoziDto1.setRoomId(paraMap.getString("roomId"));
			zhuoziDto1.setStt("0"); // 等待打牌中
			ZPaiInit.getTable().put(paraMap.getString("tableId"), zhuoziDto1);
			// 正常
			retDto.setValue("stt", "0");
		}
		return DataFormatUtil.formatRetData(retDto);
	}
	
	/**
	 * 申请退出房间
	 * @param paraMap
	 * @return
	 */
	public static synchronized String outRomm(BaseDto paraMap) {
		BaseDto retDto = new BaseDto();
		retDto.setHostRetCode(Constant.MSG_0000);
		retDto.setHostMessage(Constant.MSG_SUCCESS);
		// 检查桌子是否已经有人了
		PkTable zhuoziDto = ZPaiInit.getTable().get(paraMap.getString("tableId"));
		if(zhuoziDto != null) {
			
			// 取出用户
			List<PkPepole> peopleList = (List<PkPepole>)zhuoziDto.getValue("people");
			
    		// 正在打牌中
    		if("1".equals(zhuoziDto.getStt())
    				|| "2".equals(zhuoziDto.getStt())) {
    			// 判断用户是不是在出牌。
    			for(int i = 0; i < peopleList.size(); i++) {
    				PkPepole people = peopleList.get(i);
    				// 押注中并且等待押注时间是0的时候
    				if(people.getUserNo().equals(paraMap.getString("userNo"))) {
						if (StringUtils.isEmpty(zhuoziDto.getString("outUserNo"))) {
							zhuoziDto.setValue("outUserNo", people.getUserNo());
						}
						else {
							zhuoziDto.setValue("outUserNo", zhuoziDto.getString("outUserNo") + "," + people.getUserNo());
						}
						
						// 如果当前是押注中 需要算出下个出牌者
						if (people.getStt().equals("2")) {
							// 当前选手做弃牌处理
							people.setStt("3");
							people.setDdTime("");
							MiaoAction.nextOut(zhuoziDto, people.getAtWhere());
						}
						else {
							// 当前选手做弃牌处理
							people.setStt("3");
							people.setDdTime("");
						}

						break;
    				}
    			}
    		}
    		// **************等待打牌 并且两个人以上（包含两个人）*****************
    		else if("0".equals(zhuoziDto.getStt())) {
    			// 判断用户是不是在出牌。
    			for(int i = 0; i < peopleList.size(); i++) {
    				PkPepole people = peopleList.get(i);
    				// 退出房间
    				if(people.getUserNo().equals(paraMap.getString("userNo"))) {
    					peopleList.remove(i);
    					break;
    				}
    			}
    		}
    		
			// 如果没有人了，清除房间,减少内存使用
			if (peopleList.size() == 0) {
				ZPaiInit.getTable().remove(paraMap.getString("tableId"));
			}
		}
		return DataFormatUtil.formatRetData(retDto);
	}
	
	/**
	 * 检查是否在别的桌子正在打牌
	 * @return
	 */
	private static boolean  checkIsRunnig(String userNo) {
    	Iterator iterator2= ZPaiInit.getTable().entrySet().iterator(); 
    	List<BaseDto> retList = new ArrayList<BaseDto>();
    	PkTable base = null;
    	while(iterator2.hasNext()){  
    		Map.Entry  entry= (Map.Entry)iterator2.next(); 
    		base = (PkTable)entry.getValue();
    		// 正在打牌中
    		if("1".equals(base.getStt())) {
    			List<PkPepole> pepoleList = (List<PkPepole>)base.getValue("people");
    			PkPepole people = null;
    			for (int i = 0; i < pepoleList.size(); i++) {
    				people = pepoleList.get(i);
    				// 如果他还在打牌中
    				if (people.getUserNo().equals(userNo)) {
    					return true;
    				}
    			}
    		}
    		// 如果不是在打牌中 直接清除。
    		else {
    			List<PkPepole> pepoleList = (List<PkPepole>)base.getValue("people");
    			PkPepole people = null;
    			for (int i = 0; i < pepoleList.size(); i++) {
    				people = pepoleList.get(i);
    				// 如果他还在打牌中
    				if (people.getUserNo().equals(userNo)) {
    					pepoleList.remove(i);
    				}
    			}
    		}
    	}
    	return false;
	}
	
	/**
	 * 开始游戏
	 * @param paraMap
	 * @return
	 */
	public static String startGame(BaseDto paraMap) {
		BaseDto retDto = new BaseDto();
		retDto.setHostRetCode(Constant.MSG_0000);
		retDto.setHostMessage(Constant.MSG_SUCCESS);
		// 检查桌子是否已经有人了
		PkTable zhuoziDto = ZPaiInit.getTable().get(paraMap.getString("tableId"));
		if(zhuoziDto != null) {
			// 桌子是等待开始时间
			if (zhuoziDto.getStt().equals("0")) {
				List<PkPepole> peopleList = (List<PkPepole> )zhuoziDto.getValue("people");
				PPJFDao jfDao = (PPJFDao)BABeanFactory.getBean("JF");
				PkJF jf = new PkJF();
				jf.setUserNo(paraMap.getString("userNo"));
				jf = jfDao.getJF(jf, "0").get(0);
				// 如果当前拥有的积分比现在的要少
				if (CommonUntil.compare(paraMap.getString("inMoney"), jf.getDqfs()) > 0) {
					retDto.setHostRetCode(Constant.MSG_10007);
					retDto.setHostMessage(BAErrorMessage.push(Constant.MSG_10007));
					return DataFormatUtil.formatRetData(retDto);
				}
				// 当前积分 - 押注积分
				jf.setDqfs(CommonUntil.subtract(jf.getDqfs(), paraMap.getString("inMoney")));
				// 把用户的积分变更了。
				jfDao.updateJF(jf);
				for(int i = 0; i < peopleList.size(); i ++) {
					PkPepole pepole = peopleList.get(i);
					// 如果已经有人申请，则提示已经有人申请了。
					if (pepole.getUserNo().equals(paraMap.getString("userNo"))) {
						// 等待游戏开始
						pepole.setStt("9");
						break;
					}
				}
				
				for(int i = 0; i < peopleList.size(); i ++) {
					PkPepole pepole = peopleList.get(i);
					// 如果已经有人申请，则提示已经有人申请了。
					if (pepole.getStt().equals("9")) {
						String ddTime = ZPaiInit.getCodeMap().get("PK006").get(0).getCvalue();
						// 所有已经点开始游戏的，等待时间设为0;
						pepole.setDdTime(ddTime);
					}
				}

				
			}
			// 游戏中，请稍等
			else {
				retDto.setHostRetCode(Constant.MSG_10005);
				retDto.setHostMessage(BAErrorMessage.push(Constant.MSG_10005));
			}
		}
		return DataFormatUtil.formatRetData(retDto);
	}
	
	/**
	 * 押注
	 * @param paraMap
	 * @return
	 */
	public static String yazhu(BaseDto paraMap) {
		BaseDto retDto = new BaseDto();
		retDto.setHostRetCode(Constant.MSG_0000);
		retDto.setHostMessage(Constant.MSG_SUCCESS);
		// 检查桌子是否已经有人了
		PkTable zhuoziDto = ZPaiInit.getTable().get(paraMap.getString("tableId"));
		if(zhuoziDto != null) {
			// 桌子是打牌中
			if (zhuoziDto.getStt().equals("1")) {
				List<PkPepole> peopleList = (List<PkPepole> )zhuoziDto.getValue("people");
				
				for(int i = 0; i < peopleList.size(); i ++) {
					PkPepole pepole = peopleList.get(i);
					// 设定押注时间
					if (pepole.getUserNo().equals(paraMap.getString("userNo"))) {
						// 等待中游戏已经开始
						pepole.setStt("1");
						// 押注金额
						String yzAmt = paraMap.getString("yzAmt");
						// 押注的钱数大于当前钱数
						if (CommonUntil.compare(yzAmt, pepole.getInMoney()) > 0) {
							retDto.setHostRetCode(Constant.MSG_10006);
							retDto.setHostMessage(BAErrorMessage.push(Constant.MSG_10006));
							DataFormatUtil.formatRetData(retDto);
						}
						// *****************************计入流水***************************
						// 计入流水
						PkJFFlowDao jfFlow = (PkJFFlowDao)BABeanFactory.getBean("JFFLOW");
						PkJFFlow flDto = new PkJFFlow();
						
						flDto.setFlowNo(ZZZFormat.getTime());
						flDto.setUserNo(pepole.getUserNo());
						flDto.setXfjf(yzAmt);
						flDto.setFjNo(zhuoziDto.getRoomId());
						flDto.setZzNo(zhuoziDto.getTableId());
						flDto.setPkVa(pepole.getNowPK());
						flDto.setExDate(ZZZFormat.getTime());
						// 流水
						flDto.setEx1("9");
						flDto.setRemarks(ZPaiConstant.disPlay("押注"));
						
						jfFlow.insertJF(flDto);
						// *****************************计入流水***************************
						
						// 总金额
						zhuoziDto.setValue("dqjezh", CommonUntil.add(CommonUntil.objToString(CommonUntil.objToint(zhuoziDto.getValue("dqjezh"))), yzAmt));
						
						pepole.setInMoney(CommonUntil.subtract(pepole.getInMoney(), yzAmt));
						pepole.setOutMoney(CommonUntil.add(pepole.getOutMoney(), yzAmt));
						

						if (CommonUntil.compare(zhuoziDto.getString("maxAmt"), pepole.getOutMoney()) < 0) {
							zhuoziDto.setValue("maxAmt", pepole.getOutMoney());
						}
						pepole.setDdTime("");
						// 计算下个出牌者
						MiaoAction.nextOut(zhuoziDto, pepole.getAtWhere());
					}
				}
			}
			// 游戏中，请稍等
			else {
				retDto.setHostRetCode(Constant.MSG_10005);
				retDto.setHostMessage(BAErrorMessage.push(Constant.MSG_10005));
			}
		}
		return DataFormatUtil.formatRetData(retDto);
	}
	
	/**
	 * 弃牌：3
	 * 让牌：4
	 * 全押：5
	 * @param paraMap
	 * @return
	 */
	public static String caoZuo(BaseDto paraMap) {
		BaseDto retDto = new BaseDto();
		retDto.setHostRetCode(Constant.MSG_0000);
		retDto.setHostMessage(Constant.MSG_SUCCESS);
		// 检查桌子是否已经有人了
		PkTable zhuoziDto = ZPaiInit.getTable().get(paraMap.getString("tableId"));
		if(zhuoziDto != null) {
			// 打牌中
			if (zhuoziDto.getStt().equals("1")) {
				List<PkPepole> peopleList = (List<PkPepole> )zhuoziDto.getValue("people");
				
				for(int i = 0; i < peopleList.size(); i ++) {
					PkPepole pepole = peopleList.get(i);
					// 如果已经有人申请，则提示已经有人申请了。
					if (pepole.getUserNo().equals(paraMap.getString("userNo"))) {
						// 当前押注人的状态
						zhuoziDto.setValue("nowPeopleStt", paraMap.getString("kbn"));
						// 弃牌：3
						// 让牌：4
						// 全押：5
						pepole.setStt(paraMap.getString("kbn"));
						pepole.setDdTime("");
						// 如果做的是全押处理需要有一个边池
						if("5".equals(pepole.getStt())) {
							// 总金额
							zhuoziDto.setValue("dqjezh", CommonUntil.add(zhuoziDto.getString("dqjezh"), pepole.getInMoney()));
							pepole.setOutMoney(CommonUntil.add(pepole.getOutMoney(), pepole.getInMoney()));
							
							if (CommonUntil.compare(zhuoziDto.getString("maxAmt"), pepole.getOutMoney()) < 0) {
								zhuoziDto.setValue("maxAmt", pepole.getOutMoney());
							}
							// 算边池
							List<BaseDto> baseDtoList = new ArrayList<BaseDto>();
							// 非空
							if(zhuoziDto.getValue("bianchi") != null 
									&& !"".equals(zhuoziDto.getValue("bianchi"))) {
								baseDtoList = (List<BaseDto>)zhuoziDto.getValue("bianchi");
							}
							BaseDto bianchixinxi = new BaseDto();
							// 谁全押了。
							bianchixinxi.setValue("userNo", pepole.getUserNo());
							// 出现边池时的金额总和
							bianchixinxi.setValue("money", zhuoziDto.getValue("dqjezh"));
							
							List<PkPepole> peopleList2 = (List<PkPepole> )zhuoziDto.getValue("people");
							String youxizongderen = "";
							for(int j = 0; j < peopleList2.size(); j ++) {
								PkPepole pepole2 = peopleList2.get(j);
								// 当前还在游戏中的人。
								// 等待押注:1
								// 押注中：2--显示押注按钮
								if (pepole2.getStt().equals("1") 
										|| pepole2.getStt().equals("2")) {
									youxizongderen = youxizongderen + pepole2.getUserNo() + ",";
								}
							}
							// 游戏中的人
							bianchixinxi.setValue("yxzdr", youxizongderen);
							baseDtoList.add(bianchixinxi);
							zhuoziDto.setValue("bianchi", baseDtoList);
							
							// *****************************计入流水***************************
							// 计入流水
							PkJFFlowDao jfFlow = (PkJFFlowDao)BABeanFactory.getBean("JFFLOW");
							PkJFFlow flDto = new PkJFFlow();
							
							flDto.setFlowNo(ZZZFormat.getTime());
							flDto.setUserNo(pepole.getUserNo());
							flDto.setXfjf(pepole.getInMoney());
							flDto.setFjNo(zhuoziDto.getRoomId());
							flDto.setZzNo(zhuoziDto.getTableId());
							flDto.setPkVa(pepole.getNowPK());
							flDto.setExDate(ZZZFormat.getTime());
							// 流水
							flDto.setEx1("9");
							flDto.setRemarks(ZPaiConstant.disPlay("全押"));
							
							jfFlow.insertJF(flDto);
							// *****************************计入流水***************************
							pepole.setInMoney("0");
							
						}
						// 弃牌：3
						else if ("3".equals(pepole.getStt())) {
						}
						//让牌：4
						else if ("4".equals(pepole.getStt())) {
						}
						//跟任何：6
						else if ("6".equals(pepole.getStt())) {
							
						}
						pepole.setDdTime("0");
						MiaoAction.nextOut(zhuoziDto, pepole.getAtWhere());
						break;
					}
				}
			}
			// 游戏中，请稍等
			else {
				retDto.setHostRetCode(Constant.MSG_10005);
				retDto.setHostMessage(BAErrorMessage.push(Constant.MSG_10005));
			}
		}
		return DataFormatUtil.formatRetData(retDto);
	}

	/**
	 * 当前人剩余钱数
	 * @param paraMap
	 * @return
	 */
	public static String userNowMoney(BaseDto paraMap) {
		BaseDto retDto = new BaseDto();
		retDto.setHostRetCode(Constant.MSG_0000);
		retDto.setHostMessage(Constant.MSG_SUCCESS);
		PPJFDao jfDao = (PPJFDao)BABeanFactory.getBean("JF");
		PkJF jf = new PkJF();
		jf.setUserNo(paraMap.getString("userNo"));
		jf = jfDao.getJF(jf, "0").get(0);
		retDto.setValue("nowMoney", jf.getDqfs());
		
		return DataFormatUtil.formatRetData(retDto);
	}
}
